// 该文件中的代码旨在解压环境文件压缩包。

// 忽略警告
#define _CRT_SECURE_NO_WARNINGS

// 头文件引用
// 官方库
#include <string>
#include <fstream>
#include <filesystem>
#include <windows.h>
#include <VersionHelpers.h>

// 第三方库
#pragma comment(lib, "zlib.lib")
#pragma comment(lib, "ntdll.lib") // 静态链接 ntdll.lib
#include "zipconf.h"
#include "zip.h"

// 项目专用函数库
#include "GetEnvironmentCommon.h"





// 定义未公开的 RtlGetVersion 函数指针
typedef NTSTATUS(WINAPI* pfnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation);

bool IsWindows10Or11() {
    // 动态获取 RtlGetVersion 函数（避免直接声明依赖）
    HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
    if (!hNtdll) return false;

    pfnRtlGetVersion RtlGetVersion =
        reinterpret_cast<pfnRtlGetVersion>(GetProcAddress(hNtdll, "RtlGetVersion"));
    if (!RtlGetVersion) return false;

    // 获取版本信息
    RTL_OSVERSIONINFOW osVersion = { 0 };
    osVersion.dwOSVersionInfoSize = sizeof(osVersion);
    if (RtlGetVersion(&osVersion) != 0) { // STATUS_SUCCESS 为 0
        return false;
    }

    // Windows 10/11 的主版本号均为 10
    if (osVersion.dwMajorVersion == 10) {
        // Windows 10: build 10240 (1507) 至 19045 (22H2)
        // Windows 11: build 22000 (21H2) 及更高
        return (osVersion.dwBuildNumber >= 10240);
    }

    return false;
}

bool IsWindows11OrLater() {
    // Windows 11 的起始内部版本号为 22000
    const DWORD WIN11_BUILD = 22000;

    HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
    if (!hNtdll) return false;

    pfnRtlGetVersion RtlGetVersion =
        reinterpret_cast<pfnRtlGetVersion>(GetProcAddress(hNtdll, "RtlGetVersion"));
    if (!RtlGetVersion) return false;

    RTL_OSVERSIONINFOW osVersion = { 0 };
    osVersion.dwOSVersionInfoSize = sizeof(osVersion);
    if (RtlGetVersion(&osVersion) != 0) {
        return false;
    }

    return (osVersion.dwMajorVersion == 10 &&
        osVersion.dwBuildNumber >= WIN11_BUILD);
}


// 释放目标开发环境 - 准备阶段
// 检测系统版本是否为 win10 及以上
bool isModernWindows() {
    bool Flag_isModernWindows;
    if (IsWindows10Or11()) {
        if (IsWindows11OrLater()) {
            Flag_isModernWindows = true; // 当前系统是 Windows 11
        }
        else {
            Flag_isModernWindows = true; // 当前系统是 Windows 10
        }
    }
    else {
        Flag_isModernWindows = false; // 当前系统不是 Windows 10/11
    }
    return Flag_isModernWindows;
}


// 释放目标开发环境 - 开始释放资源文件
// 使用libzip进行解压（用于旧版Windows）
bool extractWithLibzip(const char* zipPath, const char* destPath) {
    int err = 0;
    zip* z = zip_open(zipPath, 0, &err);
    if (z == nullptr) {
        return false;
    }

    zip_int64_t num_entries = zip_get_num_entries(z, 0);
    for (zip_int64_t i = 0; i < num_entries; i++) {
        const char* name = zip_get_name(z, i, 0);
        std::string fullPath = std::string(destPath) + "\\" + name;

        // 创建目录
        if (name[strlen(name) - 1] == '/') {
            std::filesystem::create_directories(fullPath);
            continue;
        }

        // 解压文件
        zip_file* file = zip_fopen_index(z, i, 0);
        if (file) {
            FILE* out = fopen(fullPath.c_str(), "wb");
            if (out) {
                char buf[4096];
                zip_int64_t len;
                while ((len = zip_fread(file, buf, sizeof(buf))) > 0) {
                    fwrite(buf, 1, len, out);
                }
                fclose(out);
            }
            zip_fclose(file);
        }
    }

    zip_close(z);
    return true;
}


// 释放目标环境 - 开始释放资源文件
// 解压目标开发环境的文件
// 尝试解压解压与目标环境相关的文件，并获得是否执行成功的返回值
bool getDevEnvironment(int GetInstallPosition, std::string RelativePath) {
    
    // 创建目标目录
    std::filesystem::path targetPath;
    if(GetInstallPosition==1)
        targetPath = "D:\\Environment";
    else
        targetPath = "C:\\Environment";

    if (!std::filesystem::exists(targetPath)) {
        std::filesystem::create_directory(targetPath);
    }

    bool success = false;

    // 检测系统版本并选择解压方式
    if (isModernWindows()) {
        // 使用PowerShell方式解压（原有代码）
        std::string command;
        if (GetInstallPosition == 1)
            command = "powershell -command \"Expand-Archive -Path '" + RelativePath + "' -DestinationPath 'D:\\Environment' -Force\"";
        else
            command = "powershell -command \"Expand-Archive -Path '" + RelativePath + "' -DestinationPath 'C:\\Environment' -Force\"";
        success = (system(command.c_str()) == 0);
    }
    else {
        // 使用libzip方式解压
        if (GetInstallPosition == 1)
            success = extractWithLibzip(RelativePath.c_str(), "D:\\Environment");
        else
            success = extractWithLibzip(RelativePath.c_str(), "C:\\Environment");
    }
    
    return success;  // 反馈是否成功执行
}